package com.starlink.client.jd.request;

import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCreateOrderV1.CommonCreateOrderRequest;
import com.starlink.client.jd.request.base.CommonCargoInfo;
import com.starlink.client.jd.request.base.CommonProductInfo;
import com.starlink.client.jd.request.base.Contact;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;

import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 创建订单入参模型
 * 传参规则详情见京东文档
 * <a href="https://open.jdl.com/#/open-business-document/api-doc/267/841"/>
 */
@Data
@NoArgsConstructor
public class CreateOrderRequest implements Serializable {
    /**
     * 商家订单号；字段长度1-50。orderOrigin=1或2或4或5时请保证客户编码下唯一，若使用相同的订单号下单会导致下单失败
     * eg: LJ202204141438
     */
    private String orderId;
    /**
     * 寄件人信息
     */
    private Contact senderContact;
    /**
     * 收件人信息
     */
    private Contact receiverContact;
    /**
     * 下单来源 0-c2c 1-b2c 2-c2b 4-kyb2c 5- kyc2c，
     * 详细说明：https://cloud.jdl.com/#/open-business-document/access-guide/267/54152
     */
    private Integer orderOrigin;
    /**
     * 客户编码，orderOrigin为 1 或者 2 时必填；
     * orderOrigin为0时不要传此参数；与京东物流签约后生成，长度1-32
     */
    private String customerCode;
    /**
     * 产品信息； 主产品必填且只能填一种，增值产品可以填多个
     */
    private CommonProductInfo productsReq;
    /**
     * 付款方式 1-寄付 2-到付 3-月结 5-多方收费，
     * orderOrigin= 0或5时，枚举值：1-寄付；2-到付；
     * orderOrigin= 1 或4时，枚举值：1-寄付；2-到付；3-月结；
     * orderOrigin为2时，枚举值：5-多方收费，多方收费指下单费用由多个模块或主体来支付，逆向取件时运费、包装费以及保险费用可能由商家以及C消费者分别承担，具体参考c2bAddedSettleTypeInfo枚举传入
     * eg: 3
     */
    private Integer settleType;
    /**
     * 货品信息；寄递货物的基础信息，包括重量体积以及包裹的长宽高等。必填；现阶段不支持传多个货品信息，只能传一个对象
     */
    private List<CommonCargoInfo> cargoes;
    /**
     * 下单备注；此信息显示在面单上，长度1-500；面单上截取前50个字符显示
     */
    private String remark;

    /**
     * 模型转换
     * @return
     */
    public CommonCreateOrderRequest toJd4Create() {
        CommonCreateOrderRequest request = new CommonCreateOrderRequest();
        request.setOrderId(this.orderId);
        request.setSenderContact(this.senderContact.toJdCreate());
        request.setReceiverContact(this.receiverContact.toJdCreate());
        request.setOrderOrigin(this.orderOrigin);
        request.setCustomerCode(this.customerCode);
        request.setProductsReq(this.productsReq.toJd4Create());
        request.setSettleType(this.settleType);
        if (CollectionUtils.isNotEmpty(this.cargoes)) {
            request.setCargoes(this.cargoes.stream().map(CommonCargoInfo::toJd4Create).collect(Collectors.toList()));
        }
        request.setRemark(this.remark);
        return request;
    }
}
